package com.icoolkj.ms.upload.task;

import cn.hutool.core.date.DateUtil;
import com.icoolkj.ms.upload.mapper.FileInfoMapper;
import com.icoolkj.ms.upload.model.FileInfo;
import com.icoolkj.ms.upload.service.FileService;
import com.icoolkj.ms.upload.util.MinioUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 * 文件清理定时任务
 * 
 * @author icoolkj
 */
@Slf4j
@Component
public class FileCleanupTask {

    @Autowired
    private FileInfoMapper fileInfoMapper;
    
    @Autowired
    private MinioUtil minioUtil;
    
    /**
     * 临时文件保留天数（默认7天）
     */
    @Value("${file.temp.retention-days:7}")
    private int tempFileRetentionDays;
    
    /**
     * 已删除文件保留天数（默认30天）
     */
    @Value("${file.deleted.retention-days:30}")
    private int deletedFileRetentionDays;
    
    /**
     * 每天凌晨2点执行清理临时文件任务
     */
    @Scheduled(cron = "0 0 2 * * ?")
    public void cleanupTempFiles() {
        log.info("开始清理临时文件...");
        try {
            // 计算临时文件过期时间
            Date expireDate = DateUtil.offsetDay(new Date(), -tempFileRetentionDays);
            
            // 查询过期的临时文件
            List<FileInfo> expiredTempFiles = fileInfoMapper.selectExpiredTempFiles(expireDate);
            log.info("找到{}个过期临时文件", expiredTempFiles.size());
            
            // 清理过期的临时文件
            for (FileInfo fileInfo : expiredTempFiles) {
                try {
                    // 从MinIO中删除文件
                    minioUtil.removeObject(fileInfo.getBucketName(), fileInfo.getFilePath());
                    // 从数据库中删除文件记录
                    fileInfoMapper.deleteByIdPhysical(fileInfo.getFileId());
                    log.info("已清理临时文件: {}", fileInfo.getFileName());
                } catch (Exception e) {
                    log.error("清理临时文件失败: {}", fileInfo.getFileName(), e);
                }
            }
            log.info("临时文件清理完成");
        } catch (Exception e) {
            log.error("清理临时文件任务异常", e);
        }
    }
    
    /**
     * 每周日凌晨3点执行清理已删除文件任务
     */
    @Scheduled(cron = "0 0 3 ? * SUN")
    public void cleanupDeletedFiles() {
        log.info("开始清理已删除文件...");
        try {
            // 计算已删除文件过期时间
            Date expireDate = DateUtil.offsetDay(new Date(), -deletedFileRetentionDays);
            
            // 查询过期的已删除文件（del_flag = '1'）
            List<FileInfo> expiredDeletedFiles = fileInfoMapper.selectExpiredDeletedFiles(expireDate);
            log.info("找到{}个过期已删除文件", expiredDeletedFiles.size());
            
            // 清理过期的已删除文件
            for (FileInfo fileInfo : expiredDeletedFiles) {
                try {
                    // 从MinIO中删除文件
                    minioUtil.removeObject(fileInfo.getBucketName(), fileInfo.getFilePath());
                    // 从数据库中删除文件记录
                    fileInfoMapper.deleteByIdPhysical(fileInfo.getFileId());
                    log.info("已清理已删除文件: {}", fileInfo.getFileName());
                } catch (Exception e) {
                    log.error("清理已删除文件失败: {}", fileInfo.getFileName(), e);
                }
            }
            log.info("已删除文件清理完成");
        } catch (Exception e) {
            log.error("清理已删除文件任务异常", e);
        }
    }
} 